<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>超市管理系统设计报告</title>
    <style>
        body {
            font-family: "宋体", SimSun, serif;
            line-height: 1.5;
            margin: 0;
            padding: 40px;
            background-color: #fff;
            color: #000;
        }

        .container {
            max-width: 800px;
            margin: 0 auto;
        }

        h1 {
            text-align: center;
            font-size: 22px;
            font-weight: bold;
            margin: 30px 0;
        }

        h2 {
            font-size: 16px;
            font-weight: bold;
            margin: 20px 0 10px 0;
            text-indent: 0;
        }

        h3 {
            font-size: 14px;
            font-weight: bold;
            margin: 15px 0 8px 0;
            text-indent: 0;
        }

        p {
            font-size: 12px;
            text-indent: 2em;
            margin: 8px 0;
            text-align: justify;
        }

        .no-indent {
            text-indent: 0;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin: 15px 0;
            font-size: 12px;
        }

        th,
        td {
            border: 1px solid #000;
            padding: 8px;
            text-align: center;
        }

        th {
            background-color: #f0f0f0;
            font-weight: bold;
        }

        pre {
            background-color: #f5f5f5;
            padding: 10px;
            border: 1px solid #ddd;
            font-size: 10px;
            overflow-x: auto;
            margin: 10px 0;
        }

        .mermaid {
            text-align: center;
            margin: 20px 0;
        }

        .author-info {
            text-align: center;
            margin: 20px 0;
            font-size: 12px;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
    <script>
        mermaid.initialize({ startOnLoad: true });
    </script>
</head>

<body>
    <div class="container">
        <h1>超市管理系统设计报告</h1>

        <div class="author-info">
            <p class="no-indent"><strong>学生姓名：</strong>XXX</p>
            <p class="no-indent"><strong>学号：</strong>XXXXXXXXX</p>
            <p class="no-indent"><strong>专业班级：</strong>计算机科学与技术</p>
            <p class="no-indent"><strong>指导教师：</strong>XXX</p>
            <p class="no-indent"><strong>完成时间：</strong>2024年XX月</p>
        </div>

        <h2>一、需求分析</h2>

        <h3>1. 设计题目</h3>
        <p>基于Python的超市管理系统控制台应用程序设计与实现。本系统旨在为小型超市提供一套完整的商品管理解决方案，通过控制台界面实现商品的进销存管理、用户权限控制以及数据统计分析等核心功能。</p>

        <h3>2. 系统功能需求分析</h3>
        <p>在实际调研和分析中，我发现传统的小型超市往往缺乏系统化的管理工具，店主通常依靠手工记录或简单的电子表格来管理商品信息，这种方式不仅效率低下，而且容易出错。因此，本系统的设计重点关注实用性和易操作性。</p>

        <p>系统的核心需求包括：管理员身份验证机制确保数据安全性，支持多管理员注册和登录；商品信息管理功能需要涵盖商品的基本属性（编号、名称、进价、售价、库存），并提供完整的增删改查操作；进销存管理要能够处理日常的进货、退货和销售业务，自动更新库存数量并计算交易金额；查询统计功能应支持多种条件的商品检索和数据分析，帮助经营决策；数据持久化存储确保系统重启后信息不丢失，同时提供数据备份功能防止意外丢失。
        </p>

        <p>在用户体验方面，考虑到目标用户可能对计算机操作不够熟练，系统界面设计采用简洁明了的菜单结构，每个操作都有清晰的提示信息，并加入了输入验证和错误处理机制，尽可能避免因误操作导致的数据错误。</p>

        <h2>二、概要设计</h2>

        <h3>系统总体设计框架</h3>
        <p>系统采用模块化设计思想，按功能划分为几个相对独立的模块。整体架构遵循"数据-业务逻辑-用户界面"三层分离的原则，虽然在控制台应用中这种分离不如GUI应用明显，但在代码组织上仍然体现了这一思想。</p>

        <div class="mermaid">
            graph TD
            A[系统启动] --> B[加载数据]
            B --> C[主菜单]
            C --> D[管理员注册]
            C --> E[管理员登录]
            C --> F[退出系统]
            E --> G[登录验证]
            G -->|成功| H[管理员控制面板]
            G -->|失败| C
            H --> I[数据库管理]
            H --> J[商品展示]
            H --> K[进货管理]
            H --> L[退货管理]
            H --> M[销售管理]
            H --> N[查询功能]
            H --> O[排序功能]
            H --> P[统计分析]
            H --> Q[数据备份]
            I --> R[保存数据]
            K --> R
            L --> R
            M --> R
            M --> S[销售日志]
        </div>

        <p>数据存储层使用本地文件系统，管理员信息存储在admins.txt文件中，商品信息存储在shangpins.txt文件中，销售记录存储在sales_log.txt文件中。这种设计既满足了数据持久化的需求，又保持了系统的轻量级特性，无需依赖外部数据库系统。
        </p>

        <p>业务逻辑层包含了所有的核心功能模块，每个模块都有明确的职责边界。用户管理模块负责管理员的注册、登录和权限验证；商品管理模块处理商品的CRUD操作；交易管理模块处理进货、退货和销售业务；查询统计模块提供各种查询和分析功能；数据管理模块负责数据的加载、保存和备份。
        </p>

        <h2>三、详细设计</h2>

        <p>在概要设计的基础上，本章节将深入探讨系统中几个核心功能模块的具体实现算法、数据结构选择以及关键代码的逻辑。设计的核心思路是在保证功能完整性的前提下，追求代码的简洁性、可读性和健壮性。</p>

        <h3>1. 数据结构与存储设计</h3>
        <p>系统的数据管理是其核心。我选择了简单而高效的数据结构与存储方式，以适应控制台应用的需求。商品信息在内存中由一个Python列表`shangpin_list`进行管理，列表中的每个元素都是一个代表具体商品的元组（Tuple）。我特意为此定义了一个类型别名
            `Product = Tuple[str, str, int, int, int]`，这不仅增强了代码的可读性，也明确了商品数据包含编号、名称、进价、售价和库存这五个部分。</p>
        <p>之所以选择元组而非列表或自定义类，是基于对商品属性稳定性的考虑。一件商品的基本信息（如编号、名称）一经确定便不应轻易改变，元组的不可变性（immutability）恰好满足了这一需求，同时也带来了微小的性能优势。当需要更新库存这类可变数据时，我的策略是创建一个包含新库存值的新元组，并替换掉列表中旧的元组。例如，在销售函数中，库存更新的代码如下：
        </p>
        <pre><code># 更新库存
new_stock = product[4] - n
shangpin_list[index] = (product[0], product[1], product[2], product[3], new_stock)</code></pre>
        <p>对于数据的持久化，我采用了文本文件（.txt）存储，以CSV（逗号分隔值）格式组织数据。例如，`shangpins.txt`中的每一行都代表一件商品。这种方式无需外部数据库依赖，简化了程序的部署，并且数据文件直观易读，便于人工检查或修改。为了解耦文件读写与业务逻辑，我设计了两个辅助函数`to_csv`和`from_csv`，专门负责内存中的元组对象与文件中的字符串行之间的转换。在加载数据时，我特别设计了健壮的错误处理机制，即使某一行数据格式错误，程序也不会崩溃，而是会打印警告并跳过该行，保证了系统的稳定性。
        </p>
        <pre><code>def load_shangpins():
    # ...
    with open("shangpins.txt", "r", encoding="utf-8") as file:
        for line_num, line in enumerate(file, 1):
            # ...
            product = from_csv(line)
            if product:
                shangpin_list.append(product)
            else:
                # 跳过格式错误的行并给出提示
                print_warning(f"商品文件第{line_num}行格式错误，已跳过")
    # ...</code></pre>

        <h3>2. 核心业务逻辑算法</h3>
        <p>系统的核心功能由一系列业务逻辑函数驱动，其中最具代表性的是商品销售（`sell`）和通用数字输入（`_input_number`）函数。</p>
        <p>商品销售功能的实现模拟了真实的收银流程，算法步骤严谨，确保了交易的准确性和数据的一致性。首先，通过用户输入的商品编号调用`find_product_by_id`函数进行精确查找，如果未找到或商品库存为零，则终止交易并给出明确提示，防止无效操作。接着，系统会调用`_input_number`函数来获取用户希望购买的数量，该函数会验证输入值必须在1和当前最大库存之间。然后，程序计算出总金额并要求用户输入实际收款。一个关键的逻辑判断是
            `if q <
                total_amount:`，确保收款金额充足，否则交易失败。交易成功后，程序会更新内存中的商品库存，调用`save_shangpins`将最新的数据写入文件，并通过`log_sale`记录销售日志，最后计算并显示找零。这一系列步骤环环相扣，保证了每笔交易的完整性。</p>
                <p>为了提高代码复用性和输入的健壮性，我设计了`_input_number`辅助函数。它通过一个`while True`循环，反复提示用户输入，直到获得一个有效的整数。函数内部的`try-except
                    ValueError`块用于捕获非数字输入的异常。此外，它还支持可选的`min_val`和`max_val`参数，能够灵活地对输入数字进行范围限定，极大地简化了主流程代码中对数字输入的验证逻辑。无论是获取商品数量、价格还是菜单选项，都复用了这个函数，有效减少了代码冗余。
                </p>
                <pre><code>def _input_number(prompt: str, min_val: int = None, max_val: int = None) -> int:
    while True:
        try:
            value = int(input(prompt).strip())
            if min_val is not None and value < min_val:
                print_error(f"输入值不能小于 {min_val}")
                continue
            if max_val is not None and value > max_val:
                print_error(f"输入值不能大于 {max_val}")
                continue
            return value
        except ValueError:
            print_error("请输入一个有效的数字")</code></pre>

                <h2>四、调试分析过程描述</h2>

                <p>在整个系统的开发和调试过程中，我遇到了不少挑战。解决这些问题的过程，不仅完善了程序功能，也加深了我对软件开发严谨性的理解。以下是几个典型问题的分析与解决过程。</p>

                <h3>1. 问题：数据持久化与一致性风险</h3>
                <p><strong>出错现象：</strong>
                    在早期版本中，如果程序在执行一项修改操作（如销售或进货）的过程中意外中断，可能会导致内存中的数据与磁盘文件中的数据不一致。例如，一个商品成功售出后，内存中的库存减少了，但程序在调用保存函数前就崩溃了，那么下次启动系统时，商品库存依然是未减少的旧数据，造成了账实不符。
                </p>
                <p><strong>出错原因：</strong> 关键原因在于数据修改和数据保存是分离的两个步骤，中间存在时间窗口，任何中断都会破坏操作的原子性。</p>
                <p><strong>解决方法：</strong>
                    我采取的策略是在每次完成关键数据修改后，立即调用`save_shangpins()`函数进行文件写入。例如，在`sell`函数中，库存计算完成后，紧接着就是更新列表和保存文件两个步骤。这种"即时保存"的策略，虽然会增加I/O操作的频率，但对于本系统这种单用户、操作不频繁的场景来说，极大地增强了数据的可靠性。在后续反思中，我意识到对于`create_database`这样的批量添加场景，在循环中频繁写入是低效的。因此，在该函数中，我采用了不同的策略，即在整个循环结束后进行单次保存，这是在数据一致性与系统性能之间进行权衡后做出的设计决策，也让我学到了针对不同业务场景选择不同技术方案的重要性。
                </p>

                <h3>2. 问题：输入验证的健壮性不足</h3>
                <p><strong>出错现象：</strong> 测试时发现，当用户输入一些非预期的值，如空字符串、带空格的数字、或者在要求输入编号的地方输入一个已存在的编号时，程序可能会抛出异常或产生逻辑错误。</p>
                <p><strong>出错原因：</strong> 最初的输入逻辑过于理想化，没有全面地考虑用户的各种"不规范"操作。</p>
                <p><strong>解决方法：</strong>
                    我为此建立了一套完整的输入验证体系。首先，所有接收输入的代码都使用了`.strip()`方法，预先清除用户可能误输入的前后空格。其次，我编写了多个独立的验证函数，如`validate_product_id`、`validate_product_name`等，每个函数只负责一项检查。在需要用户输入的地方，我构建了一个健壮的`while
                    True`循环验证逻辑。以添加商品时输入编号为例：</p>
                <pre><code>while True:
    bianhao = input("编号: ").strip()
    if not validate_product_id(bianhao):  # 检查格式和长度
        continue
    if find_product_by_id(bianhao) is not None:  # 检查是否重复
        print_error("编号已存在，请重新输入")
        continue
    break  # 所有检查通过后才跳出循环</code></pre>
                <p>这个校验链确保了只有在格式正确且不与现有数据冲突的情况下，程序才会继续执行。这种防御性编程的思维方式，显著提升了程序的稳定性和可靠性。</p>

                <h3>3. 问题：用户体验的迭代优化</h3>
                <p><strong>出错现象：</strong> 程序的初版虽然功能可用，但用户界面非常单调，全是黑白文字。出错提示也很简陋，如统一的"输入错误"，用户体验较差。</p>
                <p><strong>出错原因：</strong> 开发初期我更关注功能的实现，忽略了人机交互的友好性。</p>
                <p><strong>解决方法：</strong> 我意识到，一个好的程序不仅要能用，还要好用。为此，我进行了一次全面的交互优化。我设计了一系列带有Emoji图标的打印函数：`print_success`
                    (✅), `print_error` (❌), `print_warning` (⚠️), `print_info`
                    (ℹ️)。这些带有视觉符号的提示，比纯文本更直观，能帮助用户快速把握当前的状态。同时，我细化了错误提示信息，例如，`_input_number`函数会明确告诉用户"输入值不能小于/大于某个数"，而不是模糊的"输入无效"。这个优化过程让我深刻体会到，用户体验是软件质量的重要组成部分，从用户的角度出发去思考和设计，才能做出真正受欢迎的程序。
                </p>

                <h2>五、测试结果</h2>

                <h3>测试数据设计</h3>
                <table>
                    <tr>
                        <th>测试类型</th>
                        <th>测试数据</th>
                        <th>预期结果</th>
                        <th>实际结果</th>
                        <th>测试结论</th>
                    </tr>
                    <tr>
                        <td>用户注册</td>
                        <td>用户名: admin123<br>密码: password123</td>
                        <td>注册成功</td>
                        <td>注册成功，信息保存到admins.txt</td>
                        <td>通过</td>
                    </tr>
                    <tr>
                        <td>用户登录</td>
                        <td>正确用户名密码</td>
                        <td>登录成功，进入管理界面</td>
                        <td>显示欢迎信息，进入管理界面</td>
                        <td>通过</td>
                    </tr>
                    <tr>
                        <td>商品添加</td>
                        <td>编号: SP001<br>名称: 苹果<br>进价: 3<br>售价: 5<br>库存: 100</td>
                        <td>商品添加成功</td>
                        <td>商品成功添加到数据库</td>
                        <td>通过</td>
                    </tr>
                    <tr>
                        <td>商品销售</td>
                        <td>商品编号: SP001<br>购买数量: 10<br>收款: 50</td>
                        <td>销售成功，库存减少10，找零0</td>
                        <td>销售成功，库存更新为90，显示找零0元</td>
                        <td>通过</td>
                    </tr>
                    <tr>
                        <td>库存查询</td>
                        <td>查询编号: SP001</td>
                        <td>显示商品详细信息</td>
                        <td>正确显示商品信息和当前库存</td>
                        <td>通过</td>
                    </tr>
                    <tr>
                        <td>数据备份</td>
                        <td>执行备份操作</td>
                        <td>生成备份文件</td>
                        <td>成功生成时间戳命名的备份文件</td>
                        <td>通过</td>
                    </tr>
                </table>

                <h3>功能界面展示</h3>
                <p class="no-indent"><strong>1. 系统主界面</strong></p>
                <p>系统启动后首先显示欢迎信息和主菜单，界面简洁明了，用等号装饰的标题"超市管理系统"居中显示，下方提供三个主要选项：管理员注册、管理员登录和退出系统。界面使用了Emoji图标增强视觉效果，使用户能够快速理解每个选项的功能。
                </p>

                <p class="no-indent"><strong>2. 管理员注册界面</strong></p>
                <p>注册界面采用分步骤的输入方式，首先要求输入用户名，系统会实时验证用户名格式并检查重复性，如果验证失败会显示具体的错误信息并要求重新输入。密码输入采用双重确认机制，要求用户输入两次相同的密码，增强了密码输入的准确性。所有提示信息都使用了彩色图标，成功信息显示绿色对勾，错误信息显示红色叉号。
                </p>

                <p class="no-indent"><strong>3. 管理员控制面板</strong></p>
                <p>登录成功后进入管理员控制面板，这是系统的核心操作界面。界面标题使用星号装饰，区别于主菜单的等号装饰，视觉层次清晰。菜单选项采用数字编号方式，每个选项都配有相应的Emoji图标，包括建立数据库、显示商品信息、进货、退货、销售、查询、排序、统计、备份和退出等十个功能。
                </p>

                <p class="no-indent"><strong>4. 商品信息展示界面</strong></p>
                <p>商品信息显示界面设计考虑了信息的完整性和可读性。每个商品的信息包括编号、名称、进价、售价、库存数量、库存状态和利润率等详细数据。库存状态根据数量自动标识为"充足"、"偏低"或"缺货"，利润率以百分比形式显示，帮助管理者快速了解商品的盈利情况。界面顶部显示统计信息，包括商品种类、总库存量和库存总价值。
                </p>

                <p class="no-indent"><strong>5. 销售处理界面</strong></p>
                <p>销售界面的设计特别注重实际使用场景，整个流程模拟了真实的收银过程。用户输入商品编号后，系统会显示商品的详细信息供确认，然后要求输入购买数量，系统会检查库存是否充足。在收款环节，界面清晰地显示商品名称、单价、数量和应收金额，计算实际收款和找零金额，最后更新库存并显示交易完成信息。
                </p>

                <p class="no-indent"><strong>6. 查询功能界面</strong></p>
                <p>查询功能提供了四种查询方式：按编号查询、按名称模糊查询、按价格范围查询和库存预警查询。每种查询方式都有相应的输入提示和结果展示格式。特别是库存预警查询，允许用户设置预警阈值，系统会列出所有库存低于该阈值的商品，这个功能在实际使用中非常实用，能够帮助管理者及时发现需要补货的商品。
                </p>

                <h2>六、总结</h2>

                <p>通过这次超市管理系统的设计与开发，我深刻体会到了软件开发过程中理论知识与实践应用的紧密结合。整个项目从需求分析到最终实现，让我对Python语言的特性和软件工程的基本原则有了更加深入的理解。</p>

                <p>在技术学习方面，这个项目让我熟练掌握了Python的核心语法和常用库的使用。文件I/O操作、异常处理、数据结构选择等知识点在实际应用中得到了充分的锻炼。特别是在处理用户输入验证和数据格式转换时，我深刻理解了代码健壮性的重要性。Python的类型注解功能让我的代码更加清晰和易于维护，这在处理复杂数据结构时显得尤为重要。
                </p>

                <p>项目开发过程中遇到的各种问题也让我学会了如何系统性地分析和解决问题。从最初的数据结构设计到后期的性能优化，每一个决策都需要在多个方案中权衡利弊。比如在选择数据存储方式时，我比较了内存存储、文件存储和数据库存储三种方案，最终选择了文件存储，这个决策过程让我理解了不同技术方案适用场景的差异。
                </p>

                <p>在用户体验设计方面，我认识到好的软件不仅要功能完善，更要易于使用。通过不断地测试和改进，我学会了从用户角度思考问题，比如添加操作提示、错误信息的友好化处理、界面的美化等细节，这些看似简单的改进实际上对用户体验有着重要影响。
                </p>

                <p>对于Python语言，这次课程设计让我更加认识到它的优势和特点。Python的简洁语法让我能够将注意力更多地集中在逻辑实现上，而不是语法细节。丰富的内置函数和数据结构大大提高了开发效率，比如列表推导式、字典操作、字符串处理等功能都在项目中得到了广泛应用。同时，Python的跨平台特性也让软件的部署和分发变得简单。
                </p>

                <p>如果要对这次课程设计提出建议，我认为可以在以下几个方面进行改进：首先，可以增加更多的实际业务场景，比如供应商管理、会员系统等，让系统更贴近真实的商业环境；其次，可以引入单元测试的概念，教授学生如何编写测试代码来保证软件质量；再次，可以介绍一些代码规范和文档编写的最佳实践，培养学生良好的编程习惯；最后，可以适当介绍一些图形界面开发的基础知识，让学生了解不同类型用户界面的特点和适用场景。
                </p>

                <p>总的来说，这次课程设计是一次非常有价值的学习经历，它不仅巩固了我的Python编程基础，更重要的是培养了我系统性思考问题和解决问题的能力。这些经验将对我未来的学习和工作产生积极的影响。</p>

                <h2>七、源代码</h2>

                <p class="no-indent">完整的Python程序代码如下：</p>

                <pre><code># 引入os模块，用于处理文件和目录
import os  # 导入操作系统接口模块，用于文件操作
import datetime  # 导入日期时间模块，用于生成时间戳
from typing import List, Tuple, Optional  # 导入类型注解，提高代码可读性

# 定义一个全局字典admins，用于存储管理员信息
admins = {}  # 创建空字典存储管理员用户名和密码

# 定义商品类型
Product = Tuple[str, str, int, int, int]  # 定义商品类型别名：(编号, 名称, 进价, 售价, 库存)

def print_header(title: str):  # 定义打印标题的函数，参数为标题字符串
    """打印美化的标题"""
    print("\n" + "="*60)  # 打印换行和60个等号作为上边框
    print(f"{'':^20}{title:^20}{'':^20}")  # 居中显示标题，左右各20个空格
    print("="*60)  # 打印60个等号作为下边框

def print_separator():  # 定义打印分隔线的函数
    """打印分隔线"""
    print("-" * 60)  # 打印60个短横线作为分隔线

def print_success(message: str):  # 定义打印成功信息的函数
    """打印成功信息"""
    print(f"✅ {message}")  # 在消息前添加绿色对勾表示成功

def print_error(message: str):  # 定义打印错误信息的函数
    """打印错误信息"""
    print(f"❌ {message}")  # 在消息前添加红色叉号表示错误

def print_warning(message: str):  # 定义打印警告信息的函数
    """打印警告信息"""
    print(f"⚠️  {message}")  # 在消息前添加黄色警告符号

def print_info(message: str):  # 定义打印提示信息的函数
    """打印信息"""
    print(f"ℹ️  {message}")  # 在消息前添加蓝色信息符号

# [代码继续...]

# 主函数
def main():  # 定义程序主函数
    """主函数"""
    # 加载数据
    load_admins()  # 加载管理员信息
    load_shangpins()  # 加载商品信息
    
    print("🎉 欢迎使用超市管理系统 🎉".center(60, "="))  # 居中显示欢迎信息
    print("系统初始化完成...")  # 显示初始化完成信息
    
    # 如果没有管理员，提示创建
    if not admins:  # 检查是否存在管理员账户
        print_warning("系统中暂无管理员，请先注册管理员账户")  # 提示注册管理员
    
    while True:  # 主程序循环
        show_main_menu()  # 显示主菜单
        choice = input("请选择操作: ").strip()  # 获取用户选择
        
        if choice == '1':  # 用户选择注册管理员
            register()  # 调用注册函数
        elif choice == '2':  # 用户选择管理员登录
            if login():  # 调用登录函数，如果登录成功
                while True:  # 管理员操作循环
                    show_admin_menu()  # 显示管理员菜单
                    admin_choice = input("请选择操作: ").strip()  # 获取管理员选择
                    
                    if admin_choice == '1':  # 建立数据库
                        create_database()  # 调用建立数据库函数
                    elif admin_choice == '2':  # 显示全部商品
                        display_all()  # 调用显示所有商品函数
                    elif admin_choice == '3':  # 进货
                        restock()  # 调用进货函数
                    elif admin_choice == '4':  # 退货
                        return_stock()  # 调用退货函数
                    elif admin_choice == '5':  # 商品销售
                        sell()  # 调用销售函数
                    elif admin_choice == '6':  # 商品查询
                        query()  # 调用查询函数
                    elif admin_choice == '7':  # 商品排序
                        sort_items()  # 调用排序函数
                    elif admin_choice == '8':  # 数据统计
                        show_statistics()  # 调用统计函数
                    elif admin_choice == '9':  # 数据备份
                        backup_data()  # 调用备份函数
                    elif admin_choice == '0':  # 退出系统
                        print_success("感谢使用超市管理系统，再见！")  # 显示退出信息
                        return  # 退出程序
                    else:  # 无效选择
                        print_error("输入错误，请重新选择")  # 显示错误信息
                    
                    input("\n按回车键继续...")  # 等待用户按键继续
        elif choice == '3':  # 用户选择退出系统
            print_success("感谢使用超市管理系统，再见！")  # 显示退出信息
            break  # 跳出主循环
        else:  # 无效选择
            print_error("输入错误，请重新选择")  # 显示错误信息

if __name__ == "__main__":  # 检查是否为主程序运行
    try:  # 使用异常处理确保程序稳定
        main()  # 调用主函数
    except KeyboardInterrupt:  # 捕获键盘中断异常（Ctrl+C）
        print("\n\n👋 程序被用户中断，再见！")  # 显示中断信息
    except Exception as e:  # 捕获所有其他异常
        print_error(f"程序运行出错: {e}")  # 显示错误信息
        input("按回车键退出...")  # 等待用户按键后退出
</code></pre>

                <p class="no-indent"><em>注：由于篇幅限制，此处仅展示关键代码片段，完整代码请参考源文件main.py。</em></p>
    </div>
</body>

</html>